package org.dromara.easytl.exception;

/**
 * 模板语法错误异常
 * <p>
 * 当模板字符串存在语法错误时抛出此异常
 * </p>
 * 
 * @author gongjun
 * @since 1.0.0
 */
public class TemplateSyntaxException extends TemplateException {

    private static final long serialVersionUID = 1L;

    private final int line;
    private final int column;

    /**
     * 构造函数
     * 
     * @param message 异常信息
     */
    public TemplateSyntaxException(final String message) {
        this(message, -1, -1);
    }

    /**
     * 构造函数
     * 
     * @param message 异常信息
     * @param line 错误所在行号
     * @param column 错误所在列号
     */
    public TemplateSyntaxException(final String message, final int line, final int column) {
        super(formatMessage(message, line, column));
        this.line = line;
        this.column = column;
    }

    /**
     * 构造函数
     * 
     * @param message 异常信息
     * @param cause 原因异常
     */
    public TemplateSyntaxException(final String message, final Throwable cause) {
        super(message, cause);
        this.line = -1;
        this.column = -1;
    }

    /**
     * 获取错误所在行号
     * 
     * @return 行号，如果未知则返回 -1
     */
    public int getLine() {
        return line;
    }

    /**
     * 获取错误所在列号
     * 
     * @return 列号，如果未知则返回 -1
     */
    public int getColumn() {
        return column;
    }

    /**
     * 格式化异常信息
     * 
     * @param message 原始信息
     * @param line 行号
     * @param column 列号
     * @return 格式化后的信息
     */
    private static String formatMessage(final String message, final int line, final int column) {
        if (line >= 0 && column >= 0) {
            return String.format("语法错误 [行:%d, 列:%d]: %s", line, column, message);
        } else if (line >= 0) {
            return String.format("语法错误 [行:%d]: %s", line, message);
        } else {
            return message;
        }
    }
}

